package com.specter.dev.docs.builder;

import java.util.ArrayList;
import java.util.List;

import com.specter.dev.docs.builder.GenConfiguration.JApi;
import com.specter.dev.docs.builder.GenConfiguration.JApiInput;
import com.specter.dev.docs.builder.GenConfiguration.JApiOutput;
import com.specter.dev.docs.execute.JApiInputExe;
import com.specter.dev.docs.execute.JApiInputExeFactory;
import com.specter.dev.docs.execute.JApiOutputExe;
import com.specter.dev.docs.execute.JApiOutputExeDefault;
import com.specter.utils.JSONUtils;
import com.specter.utils.StringUtils;

/**
 * Note:手动执行时的main入口
 * 
 * @author Liang.Wang
 * @version Mar 23, 2017
 */
public class GenConfigurationBuilder {

	private GenConfiguration config;
	private JApiInputExe iexe;
	private JApiOutputExe oexe;

	private GenConfigurationBuilder() {
		this.iexe = null;// 后面动态生成
		this.oexe = new JApiOutputExeDefault();
	}

	public static GenConfigurationBuilder cfg(String config) {
		GenConfigurationBuilder builder = new GenConfigurationBuilder();
		builder.config = new GenConfiguration(config);
		return builder;
	}

	/**
	 * 根据配置生成相应的文件（<b style="color:red;">这里是一次性加载所有的LINK源，推荐一次只配置一个源</b>）
	 */
	public void build() {
		// 初始化配置文件并生成本对象
		for (JApi japi : config.japis) {
			this.build(japi);// 默认输出处理类
		}
	}

	public void build(JApi japi) {

		// 1.执行input获取实体列表
		List<Object> list = new ArrayList<>();
		for (JApiInput input : japi.getInputs()) {
			iexe = JApiInputExeFactory.create(input.getTyp());
			list.addAll(iexe.input(input));
		}

		// 2.封装公共数据
		JApiOutputExe.DataModel data = new JApiOutputExe.DataModel();
		data.setMeta(japi.getMetas());
		data.setList(list);
		data.func("_text", new StringUtils());
		data.func("_json", new JSONUtils());

		// 3.执行output生成相应文件
		for (JApiOutput output : japi.getOutputs()) {
			oexe.output(output, data);
		}
		System.out.println("====== 所有文件生成成功 ！======");
	}

}
